package com.zijidelu.luframework.config.json;

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

/**
 * 框架Jackson自定义器抽象基类
 * 提供默认的Jackson配置，子类可以继承并重写方法来自定义配置
 *
 * @author zijidelu
 * @datetime 2025/10/16 15:33
 */
public abstract class LuFrameworkJacksonCustomizer {

    @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}")
    private String pattern;

    /**
     * 获取日期时间格式
     * 子类可以重写此方法来自定义日期格式
     */
    protected String getDateTimePattern() {
        return pattern;
    }

    /**
     * 创建并配置JavaTimeModule
     * 子类可以重写此方法来自定义JavaTimeModule
     */
    protected JavaTimeModule createJavaTimeModule() {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(getDateTimePattern());
        JavaTimeModule module = new JavaTimeModule();
        module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(formatter));
        module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(formatter));
        return module;
    }

    /**
     * 获取所有需要注册的Jackson模块
     * 子类可以重写此方法来添加自定义模块
     */
    protected List<Module> getJacksonModules() {
        List<Module> modules = new ArrayList<>();
        modules.add(createJavaTimeModule());

        // 添加子类自定义的模块
        addCustomModules(modules);

        return modules;
    }

    /**
     * 添加自定义模块
     * 子类可以重写此方法来添加自定义的Jackson模块
     * 默认实现为空
     */
    protected void addCustomModules(List<Module> modules) {
        // 默认实现为空，子类可以重写
    }

    /**
     * 配置Jackson2ObjectMapperBuilder
     * 子类可以重写此方法来自定义builder
     */
    protected void configureBuilder(Jackson2ObjectMapperBuilder builder) {
        // 默认实现为空，子类可以重写
    }

    /**
     * 创建Jackson2ObjectMapperBuilderCustomizer
     * 这个方法会被配置类调用来创建Bean
     */
    public Jackson2ObjectMapperBuilderCustomizer createJacksonCustomizer() {
        return builder -> {
            // 注册所有模块
            builder.modules(getJacksonModules());

            // 应用其他配置
            configureBuilder(builder);
        };
    }
}